﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Galaxy.Portal.Remoting
{
    /// <summary>Объект доступа через Remoting-соединение</summary>
    [Serializable]
    class CRemotingConnector : MarshalByRefObject, IRemotingConnector
    {
        /* -------------------------------------------------------------------------- */

        /// <summary>Список известных порталов</summary>
        private static readonly List<CRemotingPortal> f_KnownPortals = new List<CRemotingPortal>();

        /* -------------------------------------------------------------------------- */

        /// <summary>Список известных поратлов</summary>
        protected static List<CRemotingPortal> KnownPortals { get { return f_KnownPortals; } }

        /* -------------------------------------------------------------------------- */

        /// <summary>Добавить портал в список известных</summary>
        /// <param name="Portal">Портал</param>
        public static void AddPortal(CRemotingPortal Portal)
        {
            if(!Known(Portal))
                KnownPortals.Add(Portal);
        }

        /// <summary>Удалить портал из списка известных</summary>
        /// <param name="Portal">Портал</param>
        public static void RemovePortal(CRemotingPortal Portal)
        {
            if(Known(Portal))
                KnownPortals.Remove(Portal);
        }

        /// <summary>Проверка на наличие известного портала</summary>
        /// <param name="Portal">Проверяемый портал</param>
        /// <returns>Истина, если портал присутствует в списке известных</returns>
        public static bool Known(CRemotingPortal Portal)
        {
            return KnownPortals.Exists(Portal.Equals);
        }

        /* -------------------------------------------------------------------------- */

        /// <summary>Имя портала</summary>
        private string f_Name;
        /// <summary>Порт</summary>
        private int f_Port;

        /* -------------------------------------------------------------------------- */

        /// <summary>Имя портала</summary>
        public string Name { get { return f_Name; } set { f_Name = value; } }

        /// <summary>Порт портала</summary>
        public int Port { get { return f_Port; } set { f_Port = value; } }

        /// <summary>Портал присутствует</summary>
        public bool Exist { get { return KnownPortals.Exists(this.Equals); } }

        /* -------------------------------------------------------------------------- */

        /// <summary>Новый Remoting-соединитель</summary>
        /// <param name="Name">Имя портала</param>
        /// <param name="Port">Порт</param>
        public CRemotingConnector(string Name, int Port) { f_Name = Name; f_Port = Port; }

        /* -------------------------------------------------------------------------- */

        /// <summary>Строковый эквивалент</summary>
        /// <returns>Строковый эквивалент</returns>
        public override string ToString() { return Name + ":" + Port.ToString(); }

        /// <summary>ХЭШ-код</summary>
        /// <returns>ХЭШ-код</returns>
        public override int GetHashCode() { return this.ToString().GetHashCode(); }

        /// <summary>Проверка на соответствие объекта текущему</summary>
        /// <param name="obj">Проверяемый объект</param>
        /// <returns>
        /// Истина, если объект является Remoting- соединителем, или Remoting-порталом. И при этом
        /// у объектов совпадают имена и порты
        /// </returns>
        public override bool Equals(object obj)
        {
            if(obj.GetType() == this.GetType() || obj is CRemotingPortal)
                return obj.GetHashCode() == this.GetHashCode();
            return base.Equals(obj);
        }

        /* -------------------------------------------------------------------------- */
    }
}
